| package |
package := Package name: 'TP'.
package paxVersion: 1;
	basicComment: ''.


package classNames
	add: #Micro;
	add: #Pasajero;
	add: #PasajeroApurado;
	add: #PasajeroClaustrofobico;
	add: #PasajeroFiaca;
	add: #PasajeroModerado;
	add: #PasajeroObsecuente;
	yourself.

package binaryGlobalNames: (Set new
	yourself).

package globalAliases: (Set new
	yourself).

package setPrerequisites: (IdentitySet new
	add: 'C:\Documents and Settings\Ariel\Mis documentos\Dolphin Smalltalk X6\Object Arts\Dolphin\Base\Dolphin';
	yourself).

package!

"Class Definitions"!

Object subclass: #Micro
	instanceVariableNames: 'lugares asientos volumen'
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!
Object subclass: #Pasajero
	instanceVariableNames: 'jefe'
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!
Pasajero subclass: #PasajeroApurado
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!
Pasajero subclass: #PasajeroClaustrofobico
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!
Pasajero subclass: #PasajeroFiaca
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!
Pasajero subclass: #PasajeroModerado
	instanceVariableNames: 'minLugares'
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!
Pasajero subclass: #PasajeroObsecuente
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''!

"Global Aliases"!


"Loose Methods"!

"End of package definition"!

"Source Globals"!

"Classes"!

Micro guid: (GUID fromString: '{E26FC4D9-85EA-4CD1-AB03-16868E19D2DA}')!
Micro comment: ''!
!Micro categoriesForClass!Ariel! !
!Micro methodsFor!

_lugares
	"Private - Solo usado para hacer instrospeccion del array desde el workspace"
	^lugares.!

_volumen: m3
	"Private - Esta propiedad es de solo escritura"
	volumen := m3.!

bajar
	|pos|
	pos := self lugaresOcupados.
	( pos > 0 ) ifTrue: [ 
		lugares at: pos put: nil.
	] ifFalse: [
		self error:'No hay nadie para bajar'.
	].!

esPosibleSentarse
	^ self lugaresOcupados < asientos.!

initialize: cantSent and: cantPar
	asientos := cantSent.
	lugares := Array new:(cantPar + cantSent).!

lugaresLibres
	^ lugares size - self lugaresOcupados.!

lugaresOcupados
	^ (lugares indexOf: nil ifAbsent: [lugares size + 1]) - 1.!

noSubio: unPasajero
	^(lugares indexOf:unPasajero) = 0.!

primeroEnSubir
	^ lugares at:1.!

puedeSubir: unPasajero
	"El mismo pasajero no puede subir 2 veces"
	^ (self noSubio: unPasajero) & (self lugaresLibres > 0) & (unPasajero aceptaSubirA:self).!

subir: unPasajero
	|pos|
	(self puedeSubir: unPasajero) ifTrue: [ 
		pos := self lugaresOcupados + 1.
		lugares at: pos put: unPasajero.
	] ifFalse: [
		self error:( unPasajero displayString, ' no puede subir'  ).
	].!

volumen
	^volumen.! !
!Micro categoriesFor: #_lugares!private! !
!Micro categoriesFor: #_volumen:!private! !
!Micro categoriesFor: #bajar!public! !
!Micro categoriesFor: #esPosibleSentarse!public! !
!Micro categoriesFor: #initialize:and:!public! !
!Micro categoriesFor: #lugaresLibres!public! !
!Micro categoriesFor: #lugaresOcupados!public! !
!Micro categoriesFor: #noSubio:!public! !
!Micro categoriesFor: #primeroEnSubir!public! !
!Micro categoriesFor: #puedeSubir:!public! !
!Micro categoriesFor: #subir:!public! !
!Micro categoriesFor: #volumen!public! !

!Micro class methodsFor!

sentados: cantSent parados: cantPar volumen: m3
	^ (self new initialize: cantSent and: cantPar) _volumen: m3.
	! !
!Micro class categoriesFor: #sentados:parados:volumen:!public! !

Pasajero guid: (GUID fromString: '{2BA5AF9F-C85B-40E8-854D-BE69F4B00EEE}')!
Pasajero comment: ''!
!Pasajero categoriesForClass!Unclassified! !
!Pasajero methodsFor!

jefe
	"Answer the value of the receiver's 'jefe' instance variable."

	^jefe!

jefe: anObject
	"Set the value of the receiver's 'jefe' instance variable to the argument."

	jefe := anObject! !
!Pasajero categoriesFor: #jefe!accessing!public! !
!Pasajero categoriesFor: #jefe:!accessing!public! !

PasajeroApurado guid: (GUID fromString: '{F3A874B0-969C-4CC8-BE58-18BDE6999A7D}')!
PasajeroApurado comment: ''!
!PasajeroApurado categoriesForClass!Ariel! !
!PasajeroApurado methodsFor!

aceptaSubirA: unMicro
	^true.! !
!PasajeroApurado categoriesFor: #aceptaSubirA:!public! !

PasajeroClaustrofobico guid: (GUID fromString: '{DA48C889-0D08-42B4-877E-4D173734F7FD}')!
PasajeroClaustrofobico comment: ''!
!PasajeroClaustrofobico categoriesForClass!Ariel! !
!PasajeroClaustrofobico methodsFor!

aceptaSubirA: unMicro
	^unMicro volumen > 120.! !
!PasajeroClaustrofobico categoriesFor: #aceptaSubirA:!public! !

PasajeroFiaca guid: (GUID fromString: '{00142BFA-D17B-487B-879A-BF427BEAF604}')!
PasajeroFiaca comment: ''!
!PasajeroFiaca categoriesForClass!Unclassified! !
!PasajeroFiaca methodsFor!

aceptaSubirA: unMicro 
	^unMicro esPosibleSentarse! !
!PasajeroFiaca categoriesFor: #aceptaSubirA:!public! !

PasajeroModerado guid: (GUID fromString: '{4EC38ACC-CA1A-4A2D-A1CE-4DF92E06840C}')!
PasajeroModerado comment: ''!
!PasajeroModerado categoriesForClass!Unclassified! !
!PasajeroModerado methodsFor!

aceptaSubirA: unMicro
	^(unMicro lugaresLibres) >= minLugares.!

initialize: min
	minLugares := min.! !
!PasajeroModerado categoriesFor: #aceptaSubirA:!public! !
!PasajeroModerado categoriesFor: #initialize:!public! !

!PasajeroModerado class methodsFor!

requiereAlMenos: cantLugares
	^(self new) initialize: cantLugares.! !
!PasajeroModerado class categoriesFor: #requiereAlMenos:!public! !

PasajeroObsecuente guid: (GUID fromString: '{2FE40F0B-149C-4049-AF72-C1835239546A}')!
PasajeroObsecuente comment: ''!
!PasajeroObsecuente categoriesForClass!Unclassified! !
!PasajeroObsecuente methodsFor!

aceptaSubirA: unMicro
	^(jefe isNil not) and: [jefe aceptaSubirA: unMicro].! !
!PasajeroObsecuente categoriesFor: #aceptaSubirA:!public! !

!PasajeroObsecuente class methodsFor!

empleadoDe: unJefe
	^self new jefe: unJefe.! !
!PasajeroObsecuente class categoriesFor: #empleadoDe:!public! !

"Binary Globals"!

